#include <string.h>
#include <iostream>
using std::cout;
using std::endl;
class String
{
public:
	String()
    : _str(new char[1]()) 
    {}
    /* String(){} */

	String(const char* pstr)
    :_str(new char[strlen(pstr) + 1]()) 
    {
		strcpy(_str, pstr);
	}

	//拷贝构造
	String(const String& rhs) 
    :_str(new char[strlen(rhs.c_str()) + 1]())
	{
		strcpy(_str, rhs.c_str());
	}

	String &operator=(const String &rhs){
		if (this != &rhs)
		{
			delete [] _str;
		    _str = new char[strlen(rhs.c_str()) + 1];
		    strcpy(_str, rhs.c_str());
		}
		return *this;
	}

	~String(){
		if (_str)
		{
			delete [] _str;
			_str = nullptr;
		}
	}

	void print(){
		cout << _str << endl;
	}

	size_t length() const{
		return	strlen(_str);
	}

	const char * c_str() const {
		return _str;
	}

private:
	char* _str;
};

void test0(){
    //用hello创建一个临时的string对象
    //是一个右值
    //然后调用拷贝构造，将这个右值作为参数传入
    String s1 = "hello";
}

void test1() {
	int a = 1, b = 2;
	&a;  
	&b;
	//&(a + b);//error，右值,匿名变量
	//&10;//右值
	//&String("hello");//匿名对象
    
    String("hello").print();
    
    //非const引用尝试绑定
	int & r1 = a;
	//int & r2 = 1;//非const引用不能绑定右值
    
    //const引用尝试绑定
    //conts引用可以绑定右值
	const int & r3 = 1;
	const int & r4 = a;
    
	String s1("hello");
	String s2("wangdao");
	&s1;
	&s2;

    //右值引用
    //只能绑定右值，不能绑定左值
    /* int && ref = a; */
    int && ref2 = 1;
}
int main(void){
    test0();
    return 0;
}
